#ifndef __CACTOR__H__
#define __CACTOR__H__

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Defines ///////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct
{
	t_timer elapsed;
	UINT8 alpha;
} FadeParams;

typedef struct
{
	UINT8 type;
	INT16 dest;
	t_timer t;
	float pos;
	float p1;
	float p2;
	float p3;
	float p4;
	bool done;
} MoveParams;

typedef struct
{
	t_timer t;
	UINT16 millis;
	UINT16 dur;
	bool done;
} BlinkParams;

typedef struct
{
	t_timer t;
	t_timer t_shake;
	UINT16 dur;
	INT8 type;
	INT8 rx;
	INT8 ry;
	INT8 x;
	INT8 y;
	bool done;
} ShakeParams;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class CScene;

class CActor
{
protected:
	CScene* m_scene;
	void OnTextParamChanged();

public:
	static const UINT8 ACTSTATE_INACTIVE	= 0;
	static const UINT8 ACTSTATE_ACTIVE		= 1;

	UINT8 m_actType;
	UINT8 m_actState;

	// CTOR & DTOR
	CActor(CScene* scene, UINT8 type, UINT8 numParams);
	~CActor();

	// State
	void Activate();
	void Deactivate();

	// Params
	t_param* m_params;
	t_param GetParam(UINT8 param) {return m_params[param];}
	void SetParam(UINT8 param, t_param value);

	// Position
	INT16 m_posX, m_posY;
	void SetPos(INT16 x, INT16 y);
	void GetPos(INT16 &x, INT16 &y) {x = m_posX; y = m_posY;}

	// Update / Paint
	void Update();
	void Paint(bool inCam = false);

	// Move
	MoveParams* m_moveX;
	MoveParams* m_moveY;
	void Move(UINT8 dir, UINT8 type, INT16 dest, INT16 p1 = 0, INT16 p2 = 0, INT16 p3 = 0, INT16 p4 = 0);
	bool IsMovingX() {return (m_moveX != NULL && !m_moveX->done);}
	bool IsMovingY() {return (m_moveY != NULL && !m_moveY->done);}
	bool IsMoving() {return ((m_moveX != NULL && !m_moveX->done) || (m_moveY != NULL && !m_moveY->done));}
	INT16 UpdateMove(MoveParams* mp);

	// Blink
	BlinkParams* m_blinkParams;
	void Blink(UINT16 millis, UINT16 duration);
	bool IsBlinking() {return (m_blinkParams != NULL && !m_blinkParams->done);}
	bool IsBlinkHidden() {return (m_blinkParams != NULL && (int)m_blinkParams->t % (m_blinkParams->millis << 1) >= m_blinkParams->millis);}
	void UpdateBlink();

	// Shake
	ShakeParams* m_shakeParams;
	void Shake(UINT8 type, INT8 rx, INT8 ry, UINT16 dur = 0);
	bool IsShaking() {return (m_shakeParams != NULL && !m_shakeParams->done);}
	void UpdateShake();

	bool IsActionFinished();

	// Specific
	CAnimObject* m_anim;
	CMenu* m_menu;
	//cTileManager* m_tileManager;
	FadeParams* m_fadeParams;
	void SetCameraScrollingLimit(INT16 minX, INT16 minY, INT16 maxX, INT16 maxY);

////////////////////////////////////////////////////////////////////////////////
// Game specific ///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

#define CAMERA_DEFAULT_SPEED		200
#define CAMERA_SLOW_SPEED_RANGE		20

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
};

#endif // __CACTOR__H__